package com.example.chapter12;


import java.util.Arrays;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;
import java.util.stream.IntStream;

/*
*12.2.4.终结操作
* */
public class Demo04 {

    public static void main(String[] args) {
        //forEach：对流中的每个元素执行一个操作
        List<String> list = Arrays.asList("a", "b", "c");
        list.stream().forEach(System.out::println);
        System.out.println(list);

        //collect：将流中的元素收集到一个新的集合中。
        List<String> list1 = Arrays.asList("a", "b", "c");
        List<String> collectedList = list1.stream().collect(Collectors.toList());
        System.out.println(collectedList);

        //reduce：对流中的元素进行归约操作，例如求和、找最大值等。
        List<Integer> list2 = Arrays.asList(1, 2, 3, 4, 5);
        int sum = list2.stream().reduce(0, Integer::sum);
        System.out.println(sum);


        //toArray：将流中的元素收集到一个数组。
        List<String> list3 = Arrays.asList("a", "b", "c");
        String[] array = list3.stream().toArray(String[]::new);
        System.out.println(array);


        //anyMatch、allMatch、noneMatch：对流中的元素应用一个谓词（即一个返回布尔值的函数），并返回相应的匹配结果。
        List<String> list4 = Arrays.asList("apple", "banana", "cherry");
        boolean hasApple = list4.stream().anyMatch(s -> s.equals("apple"));
        System.out.println(hasApple);


        //findFirst 和 findAny：返回流中的第一个元素或任意元素（对于并行流可能有所不同）。
        List<String> list5 = Arrays.asList("apple", "banana", "cherry");
        Optional<String> first = list5.stream().findFirst();
        System.out.println(first);

        //count：计算流中元素的数量。
        List<String> list6 = Arrays.asList("a", "b", "c");
        long count = list6.stream().count();
        System.out.println(count);


        //max 和 min：根据自然顺序或提供的比较器，返回流中的最大或最小元素。
        List<Integer> list7 = Arrays.asList(1, 2, 3, 4, 5);
        Optional<Integer> max = list7.stream().max(Integer::compare);
        System.out.println(max);

        //sum、average 等数值流的操作：对数值流执行特定的数学运算。
        IntStream numbers = IntStream.of(1, 2, 3, 4, 5);
        int sum2 = numbers.sum();

        IntStream numbers2 = IntStream.of(1, 2, 3, 4, 5);
        double average = numbers2.average().orElse(0.0);
        System.out.println(sum2);
        System.out.println(average);

    }

}
